/**
 * @(#)KategorieMapper.java
 * 1.0, 2013-01-24
 */
package de.hdm.gruppenkalender.team04.db;

import de.hdm.gruppenkalender.team04.data.*;
import java.rmi.RemoteException;
import java.sql.*;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.0885C7FD-1C2B-FD47-05C6-807C3B770FB5]
// </editor-fold>
/**
 * Mapper-Klasse, die {@link Kategorie}-Objekte auf eine relationale
 * Datenbank abbildet.
 * <p>
 * Hierzu wird eine Reihe von Methoden zur Verfügung gestellt, mit deren Hilfe
 * z.B. Objekte gesucht, erzeugt, modifiziert und gelöscht werden können.
 * <p>
 * In Anlehung an:
 * de.hdm.thies.bankprojekt.db.AccountMapper
 *
 * @author Prof. Dr. Peter Thies
 *
 * @author Mathias Bendel (mb167)
 * @author Björn Fichnter (bf023)
 * @author Stefan Hettich (sh176)
 * @author René Kugel (rk044)
 * @author Mark Leonberger (ml072)
 * @author Marta Przybylski (mp070)
 *
 * @version 1.0, 2013-01-24
 *
 */
public class KategorieMapper {

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.8D93F10F-7226-BEFC-035E-29822AC61B8A]
    // </editor-fold>
    /**
     * Die Klasse KategorieMapper wird nur einmal instantiiert. Man spricht hierbei
     * von einem sogenannten <b>Singleton</b>.
     * <p>
     * Diese Variable ist durch den Bezeichner <code>static</code> nur einmal für
     * sämtliche eventuellen Instanzen dieser Klasse vorhanden. Sie speichert die
     * einzige Instanz dieser Klasse.
     *
     * @see #kategorieMapper() 
     */
    private static KategorieMapper kategorieMapper;

    /**
     * Geschützter Konstruktor - verhindert die Möglichkeit, mit new neue
     * Instanzen dieser Klasse zu erzeugen.
     */
    protected KategorieMapper() {
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.24BEAF79-404F-8A01-9A38-BDC65ACB08DC]
    // </editor-fold>
    /**
     * Diese statische Methode kann aufgrufen werden durch
     * <code>KategorieMapper.kategorieMapper()</code>. Sie stellt die
     * Singleton-Eigenschaft sicher, indem Sie dafür sorgt, daß nur eine einzige
     * Instanz von <code>KategorieMapper</code> existiert.
     *
     * @return {@link KategorieMapper}-Objekt.
     * @see #kategorieMapper
     */
    public static KategorieMapper kategorieMapper() {
        if (kategorieMapper == null) {
            kategorieMapper = new KategorieMapper();
        }

        return kategorieMapper;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.5BAA1342-20F4-3284-C613-2D4B24FAAE6A]
    // </editor-fold>
    /**
     * Gibt ein Objekt mit übergegebener Id zurück.
     *
     * @param   id
     * @return  Kategorie   {@link Kategorie}-Objekt, oder null wenn keines gefunden wurde.
     */
    public Kategorie findeViaSchluessel(int id) {
        Connection con = DBVerbindung.connection();

        try {
            Statement stmt = con.createStatement();

            ResultSet rs = stmt.executeQuery(
                    "SELECT kategorieId, name FROM kategorie " +
                    " WHERE kategorieId =" + id + ";");

            if (rs.next()) {
                Kategorie k = new KategorieImpl();
                k.setKategorieId(rs.getInt("kategorieId"));
                k.setName(rs.getString("name"));

                con.close();

                System.out.println(KategorieMapper.class.getName() +
                        " - findeViaSchluessel ausgeführt.");

                return k;
            }
        } catch (RemoteException ex) {
            Logger.getLogger(KategorieMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(KategorieMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.88E051FF-DD66-A0B5-B661-A34F6ADDC260]
    // </editor-fold>
    /**
     * Auslesen aller {@link Kategorie}-Objekte.
     *
     * @return  Vector<Kategorie>   Ein {@link Vector} mit {@link Kategorie}-Objekten.
     */
    public Vector<Kategorie> findeAlle() {
        Connection con = DBVerbindung.connection();

        Vector<Kategorie> result = new Vector<Kategorie>();

        try {
            Statement stmt = con.createStatement();

            ResultSet rs = stmt.executeQuery(
                    "SELECT kategorieId, name FROM kategorie " +
                    " ORDER BY kategorieId");

            while (rs.next()) {
                Kategorie k = new KategorieImpl();
                k.setKategorieId(rs.getInt("kategorieId"));
                k.setName(rs.getString("name"));
                result.addElement(k);
            }

            System.out.println(KategorieMapper.class.getName() +
                    " - findeAlle ausgeführt.");
            return result;

        } catch (RemoteException ex) {
            Logger.getLogger(KategorieMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(KategorieMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.5067FA3A-8E81-1D20-0178-1D68F28D7477]
    // </editor-fold>
    /**
     * Einfügen eines {@link Kategorie}-Objekts in die Datenbank.
     *
     * @param   k   das zu speichernde Objekt
     * @return  das gespeicherte Objekt.
     */
    public Kategorie einfuegen(Kategorie k) {
        Connection con = DBVerbindung.connection();

        try {
            Statement stmt = con.createStatement();

            ResultSet rs = stmt.executeQuery(
                    "SELECT MAX(kategorieId) AS maxid " +
                    "FROM kategorie ");

            if (rs.next()) {
                k.setKategorieId(rs.getInt("maxid") + 1);
                stmt = con.createStatement();

                stmt.executeUpdate(
                        "INSERT INTO kategorie (kategorieId, name) " +
                        "VALUES ('" +
                        k.getKategorieId() + "','" +
                        k.getName() + "');");

                con.close();

                System.out.println(KategorieMapper.class.getName() +
                        " - einfuegen ausgeführt.");

                return k;
            }
        } catch (RemoteException ex) {
            Logger.getLogger(KategorieMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(KategorieMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.B06BEC68-3C9F-CAAD-1722-1B586A79DAA4]
    // </editor-fold>
    /**
     * Wiederholtes Schreiben eines Objekts in die Datenbank.
     *
     * @param   k   das Objekt, das in die DB geschrieben werden soll
     * @return  das als Parameter übergebene Objekt
     */
    public Kategorie aktualisieren(Kategorie k) {
        Connection con = DBVerbindung.connection();

        try {
            Statement stmt = con.createStatement();

            stmt.executeUpdate("UPDATE kategorie " +
                    "SET name='" + k.getName() + "' " +
                    "WHERE kategorieId=" + k.getKategorieId());

            System.out.println(KategorieMapper.class.getName() +
                    " - aktualisieren ausgeführt.");

            return k;

        } catch (RemoteException ex) {
            Logger.getLogger(KategorieMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(KategorieMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.5445783F-1CAD-7DB5-CCFD-43D77076805D]
    // </editor-fold>
    /**
     * Löschen der Daten eines {@link Kategorie}-Objekts aus der Datenbank.
     *
     * @param   id  des aus der DB zu löschenden "Objekts".
     */
    public void loeschen(int id) {
        Connection con = DBVerbindung.connection();

        try {
            Statement stmt = con.createStatement();

            stmt.executeUpdate("DELETE FROM kategorie " +
                    "WHERE kategorieId=" + id);

            System.out.println(KategorieMapper.class.getName() +
                    " - loeschen ausgeführt.");

        } catch (SQLException ex) {
            Logger.getLogger(KategorieMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Löschen der Daten eines {@link Kategorie}-Objekts aus der Datenbank.
     *
     * @param   k  das aus der DB zu löschende "Objekt".
     */
    public void loeschen(Kategorie k) {
        try {
            this.loeschen(k.getKategorieId());
        } catch (RemoteException ex) {
            Logger.getLogger(KategorieMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
    }
}
